/**
 * @Project : algorithm-learning
 * @Author : Ruoyu Wang
 * @User : Momenta
 * @DateTime : 2024/3/23 13:49
 */

//小红参加了一个奇怪的比赛，这个比赛会把排行榜封闭，只可以看到提交记录，
//提交记录是一个只由大写字母组成的字符串，每个字母对应一题的提交记录。
//为了题目的简化，我们定义si表示在时间i提交了对应字母si的题目（i从1开始）。
//一题的罚时计为这题第一次正确提交的时间+第一次正确提交之前错误提交的次数（如果没有正确提交则罚时为0），
//总罚时为所有题目的罚时之和，通过的题目数为有正确提交的**不同**题目数量。
//例如，小紫的提交记录为"AABCCCB"，如果小紫A题的第1次提交、C题的第2、3次提交是正确提交，
//其他的提交都是错误提交的话，小紫的A题罚时就是1+0=1，B题的罚时为0+0=0，C题的罚时就是5+1=6，总罚时为1+0+6=7。
//现在小红拿到了小紫的提交记录，小红只知道小紫通过了k个题目，但不知道小紫每次的提交是否正确，
//她想知道小紫可能的最小罚时是多少，最大罚时是多少。
//
//输入描述
//  第一行输入一个长度不超过10^5的只由大写字母组成的字符串s。
//  第二行输入一个整数k(0<=k<=26)，数据保证k的大小不超过s中的字母种类。
//输出描述
//  输出两个用空格隔开的整数min,max表示最小罚时和最大罚时。
//
//示例1
//输入
//AABCCCB
//2
//输出
//4 16
//说明
//  如果第1次A题提交通过，第1次B题提交通过，其他提交都没通过，则A题罚时为1+0=1，B题罚时为3+0=3，总罚时为1+3=4。
//  如果第2次B题提交通过，第3次C题提交通过，其他提交都没通过，则B题罚时为7+1=8，C题罚时为6+2=8，总罚时为8+8=16。
//
//示例2
//输入
//ABCDEFGHIJKLM
//0
//输出
//0 0
//说明
//  一题都没有通过，不会有罚时。

#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

int main() {
    string s;
    int k;
    cin >> s >> k;

    int sum[26][s.length() + 1];
    for (int i = 0; i < 26; i++) {
        sum[i][0] = 0;
    }

    for (int i = 0; i < s.length(); i++) {
        for (int j = 0; j < 26; j++) {
            sum[j][i + 1] = sum[j][i];
            if (s[i] == ('A' + j))sum[j][i + 1]++;
        }
    }

    int minTime = 0;
    for (int i = 0, x = k; i < s.length() && x > 0; i++) {
        if (sum[s[i] - 'A'][i] == 0) {
            x--;
            minTime += i + 1;
        }
    }
    int maxTime = 0;
    int maxTimes[26];
    for (int i = 0; i < 26; i++) {
        maxTimes[i] = 0;
    }
    for (int i = s.length() - 1; i >= 0; i--) {
        if (sum[s[i] - 'A'][i + 1] == sum[s[i] - 'A'][s.length()]) {
            maxTimes[s[i] - 'A'] = i + sum[s[i] - 'A'][s.length()];
        }
    }

    sort(maxTimes, maxTimes + 26);

    for (int i = 25, j = k; j > 0; j--, i--) {
        maxTime += maxTimes[i];
    }

    printf("%d %d", minTime, maxTime);

    return 0;
}